/** * $Id: jquery.settabs.js 4694 2010-06-30 11:33:28Z antonenkova $ * * Example: * *
* * header1 * *

1

*

2

*

3

* * header2 * *
1
*
2
*
3
* *
* * * * * * */ (function ($) { $.extend($.expr[":"], { toOpen: function(a) { return $(a).data("toOpen"); } }); $.fn.getAnchor = function(){ if (anchor = this.children().attr("Name")) { return anchor = "#" + anchor; } else { return null; } }; $.fn.getClassNames = function(){ if (name = this.attr("className")) { return name.split(" "); } else { return []; } }; $.fn.openSelectTab = function(){ $(".tabHeaderActive").removeClass("tabHeaderActive"); this.addClass("tabHeaderActive"); var n = this.getClassNames()[0]; $(".tabContent").each(function(){ if ($(this).getClassNames()[0] == n){ $(this).data("toOpen", true); } else { $(this).data("toOpen", false); $(this).removeClass("tabContentActive"); } }); return $(".tabContent:toOpen").addClass("tabContentActive"); } $.fn.settabs = function(options){ var options = $.extend({ selector: "h1", anchor: "" }, options); var selector = options.selector.replace("h", "H"); var count_tabs = $(options.selector, $(this)).size(); if (count_tabs <= 1) { return this; } $(options.selector, $(this)) .eq(0) .before("
") .end() .each( function(index){ $(this) .css("display", "block") .addClass("" + index) .addClass("tabHeader"); var elem = this.nextSibling; var elements = new Array(); while (elem && elem.nodeName != selector) { elements.push(elem); elem = elem.nextSibling; } $(elements).wrapAll("
"); $(this).getAnchor() == options.anchor ? $(this).openSelectTab() : null; $(this).appendTo(".tabList"); }) .click( function(){ if ($(this).is("tabHeaderActive")){ return; } $(".tabHeaderActive").removeClass("tabHeaderActive"); $(this).openSelectTab(); }) .hover( function(){ $(this).addClass("tabMouseOver"); }, function(){ $(this).removeClass("tabMouseOver"); }); if (options.anchor == "") { $(options.selector, $(this)) .eq(0) .openSelectTab(); } $("a[href*=#]").click(function(event){ if (event.target.pathname == document.location.pathname) { $(options.selector).each(function(){ $(this).getAnchor() == event.target.hash ? $(this).click() : null; }); } }); // Вкладка "Купить" в конец // Вкладка "Функции" после вкладки "Описание" // Вкладка "Другие программы" в конец + рыжий цвет (для by) // Вкладка "Другие программы" в конец + рыжий цвет (для by) $(options.selector, $(this)).each(function(){ if ($(this).text().toLowerCase() == "купить") { $(this).appendTo(".tabList"); } if ($(this).text().toLowerCase() == "функции") { $(this).insertAfter($(options.selector).eq(0)); } if ($(this).text().toLowerCase() == "другие программы") { $(this).appendTo(".tabList"); } if ($(this).text().toLowerCase() == "другие карты") { $(this).appendTo(".tabList"); } }); // замена пробелов в названиях вкладок на $nbsp; $(options.selector, $(this)).each(function() { var re = /(\s*[А-Яа-я]+\s*[А-Яа-я]*)/; this.innerHTML = this.innerHTML.replace(re, function($1) { $1 = $.trim($1).replace(/\s/g, '&'+'nbsp;'); return $1; }); }); return this; }; $.fn.aligntabs = function(options){ if ($(".tabHeader", $(this)).size() == 0) { return this; } var options = $.extend({ width: 500 }, options); //@todo если options.width меньше ширины самой большой вкладки return var container = this; var all_width = 0; var count_tabs_on_line = new Array(); var width_increase = new Array(); var calculateIncrease = function(count_tabs_on_line) { $.each(count_tabs_on_line, function(i, val) { var x = 0; $(".tabHeader", $(container)).not(".*").each(function(index) { var header = this; if (val > index) { x += $(header).width() + 11; $(header).addClass("*"); } }); if (x > options.width) { if (i+1 == count_tabs_on_line.length) { count_tabs_on_line[ i+1 ] = 0; } count_tabs_on_line[ i ] --; count_tabs_on_line[ i+1 ] ++; width_increase.length = null; $(".tabHeader", $(container)).removeClass("*"); calculateIncrease(count_tabs_on_line); return; } var diff = options.width - x; var increase = diff / val; var tmp = { count: val, increase: increase }; width_increase.push(tmp); }); }; $(".tabHeader", $(this)).each(function(index) { all_width += $(this).width() + 11; count_tabs = index + 1; }); count_lines = Math.ceil(all_width / options.width); while (count_lines > 0) { count_tabs_on_line.push(Math.ceil(count_tabs / count_lines)); count_tabs -= Math.ceil(count_tabs / count_lines); count_lines --; } calculateIncrease(count_tabs_on_line); $(".tabHeader", $(container)).removeClass("*"); ///у последней вкладки в строке margin-right обнуляется, /// а ширина увеличивается на 1 $.each(width_increase, function(i, val) { $(".tabHeader", $(container)).not(".*").each(function(index) { var header = this; if (index+1 < val.count) { var m = $(this).width() + val.increase; $(this).width(m); $(header).addClass("*"); } if (index+1 == val.count) { var m = $(this).width() + val.increase + 1; $(this).css("margin-right", "0").width(m); $(header).addClass("*"); } }); }); $(".tabHeader", $(container)).removeClass("*"); return this; }; })(jQuery);